用哈希算法的思想解决排序和字符串去重问题,时间复杂度为O(N)

 第一个题目:

int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 


我们所知道的常规排序中,最优的解法也就是O(N*log2^N),那如何做到时间复杂度为O(N)呢?

运用哈希算法的思想就可以优化算法为O(N)

void Sort(int* a, int n)
{
	assert(a);
	const int N = 20;
	int b[N] = { 0 };
	for (int i = 0; i < n; i++)
	{
		int key = a[i];
		++b[key];
	}

	int index = 0;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < b[i]; j++)
		{
			a[index] = i;
			++index;
		}
	}
}
int main()
{
	int arr[] = { 12, 13, 12, 13, 19, 18, 15, 12, 15, 16, 17 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	Sort(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	cin.get();
	return 0;
}



第二道题

删除小写字母字符串中重复字符。如果可以,优先删除重复字符中排在比他小字符前面的字符。 比如,输入:bbcacdww;输出:bacdw 

暴力求解的效率太低,我们同样采用哈希算法的思想。

void DeleSame(char *a, int len)
{
	bool b[256];
	int key = 0;
	memset(b, 0, sizeof(b));
	for (int i = 0; i < len; i++)
	{
		if (!b[a[i]])
		{
			b[a[i]] = true;
			a[key++] = a[i];
		}
	}
	a[key] = '\0';
}

int main()
{
	char arr[] = "ab111bcde332e";
	int len = strlen(arr);
	DeleSame(arr, len);
	cout << arr << endl;
	system("pause");
	return 0;
}














  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
字符串匹配算法是一种用来查找一个字符串(即目标串)在另一个字符串(即模式串)中的出现位置的算法。其中,KMP算法是一种比较常用的字符串匹配算法。 KMP算法的核心思想是通过利用模式串中已经匹配过的信息,来尽量减少目标串和模式串的比较次数,从而提高匹配效率。它利用一个最长公共前缀和最长公共后缀数组,记录模式串中已经匹配成功的前缀和后缀的长度。通过根据这些信息来移动模式串的位置,避免不必要的比较。 而字符串哈希算法是一种将字符串映射为一个较短的固定长度的数值的算法。通过对字符串的每个字符进行一系列运算,如求幂、取模等,最终得到一个哈希值。这个哈希值可以代表该字符串的特征,不同字符串的哈希值一般不会相同。 字符串哈希算法的主要作用是将字符串转化为一个定长的数字,方便在数据结构中进行比较和存储。在字符串匹配中,使用哈希算法可以将目标串和模式串转换为哈希值,然后比较哈希值是否相等来判断是否匹配。由于比较哈希值的时间复杂度较低,使用字符串哈希算法可以提高匹配效率。 总的来说,字符串匹配算法和字符串哈希算法都是用来处理字符串匹配的问题。KMP算法通过利用已知信息来减少比较次数,提高匹配效率;而字符串哈希算法则是将字符串转化为哈希值,便于进行比较和存储。两者都在一定程度上提高了字符串匹配的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值